/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MIPS;

import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Keiner - jorgue
 */
public class EtapaEX extends Etapa {

    private int PC = -1;
    private int RA;
    private int RB;
    private int Inm;
    private int RL;
    private int AluOutPut;
    private int[] IR;
    private boolean sigo = true;
    private boolean cambio = false;
    private int PCListo = -2;

    EtapaEX(pizarra pizarraI, pizarra pizarraD, Semaphore semaphore, Semaphore principal) {
        super(2, pizarraI, pizarraD, semaphore, principal);
    }

    
    @Override
    public void run() {
        while (true) {
            try {
                organizador.acquire();
                if (!atrasado) {
                    if (izquierda != null) {
                        synchronized (izquierda) {
                            izquierda.lock();
                            this.cambio = izquierda.getCambio();
                            if (this.cambio == false) {
                                sigo = true;
                            }
                            if (sigo) {
                                PC = izquierda.getPC();
                                IR = izquierda.getIR();
                                RA = izquierda.getRA();
                                RB = izquierda.getRB();
                                RL = izquierda.getRL();
                                Inm = izquierda.getImm();
                            }
                            izquierda.setCopiado(true);
                            izquierda.unLock();
                        }
                    }
                    //Revisar código y ejecutar operación
                    if (IR != null && sigo) {
                        //if (PCListo != PC) {
                            switch (IR[0]) { //JR
                                case 2:
                                    PC = RA;
                                    break;

                                case 3: //JAL dudas con el R31
                                    break;

                                case 4: //BEQZ Si RA = 0 salta.
                                    break;

                                case 5: //BNEZ Si RA <> 0 salta.
                                    break;

                                case 8: //DADDI
                                    AluOutPut = RA + Inm;
                                    System.out.println("Sumando DADDI: " + RA + " + " + Inm);
                                    break;

                                case 11: //LL  RB = Mem (n + RA) y RL = n + RA. esto se hace en la Etapa MEM
                                    break;

                                case 12: //DMUL
                                    AluOutPut = RA * RB;
                                    break;

                                case 14: //DDIV
                                    AluOutPut = RA / RB;
                                    break;

                                case 22: //SC Si RL ==  n + RA entonces Mem(Inm+RA) = RB else RB = 0
                                    break;

                                case 32: //DADD
                                    AluOutPut = RA + RB;
                                    break;

                                case 34: //DSUB
                                    AluOutPut = RA - RB;
                                    break;

                                case 35: //LW
                                    AluOutPut = RA + Inm;
                                    break;

                                case 43: //SW 
                                    AluOutPut = RA + Inm;
                                    System.out.println("Sumando para SW: " + RA + " + " + Inm);
                                    break;

                                default: //FIN
                            };
                       // }
                    }
                    if (derecha != null) {
                        esperar = true;
                        while (esperar) {
                            synchronized (derecha) {
                                derecha.lock();
                               
                                if (derecha.getCopiado()) {
                                    esperar = false;
                                    if (sigo && IR != null) {
                                        derecha.setRA(RA);
                                        derecha.setRB(RB);
                                        derecha.setPC(PC);
                                        derecha.setIR(IR);
                                        derecha.setRL(RL);
                                        derecha.setImm(Inm);
                                        derecha.setALU(AluOutPut);
                                        derecha.setCambio(cambio);
                                        PCListo = PC;
                                    }
                                }
                                derecha.unLock();
                            }
                        }
                    }
                    if (cambio) {
                        sigo = false;
                    }
                }
                principal.release();
                //    System.out.println("Saludos desde: " + quienSoy);
            } catch (InterruptedException ex) {
                Logger.getLogger(Etapa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
  
    
}
